package com.ibiz.znjd.baidu.location;

import com.baidu.geofence.model.DPoint;

import java.util.HashMap;
import java.util.Map;

public class GeoFenceConfig {
    /**
     * 存储配置项的map
     */
    public Map<String,Object> configMap = new HashMap<>();

    /**
     * 围栏类型，
     * CIRCLE圆形围栏
     * DISTRICT 行政区域围栏
     */
    public static enum FenceType {
        CIRCLE, DISTRICT
    }

    /**
     * 设置参数
     * @param key
     * @param value
     */
    public void setParam(String key, Object value){
        this.configMap.put(key,value);
    }

    /**
     * 设置中心坐标
     * @param latitude 纬度
     * @param longitude 经度
     */
    public void setDPoint(Double latitude, Double longitude){
        //创建一个中心点坐标
        try{
            DPoint centerPoint = new DPoint(latitude, longitude);
            this.configMap.put("dPoint", centerPoint);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    /**
     * 获取中心坐标对象
     * @return
     */
    public DPoint getDPoint(){
        return (DPoint) this.configMap.get("dPoint");
    }

    /**
     * 获取围栏类型，目前支持circle,district
     * @return
     */
    public FenceType getFenceType(){
        return (FenceType) this.configMap.get("fenceType");
    }

    /**
     * 获取周边半径
     * @return
     */
    public float getAroundRadius(){
        if(this.configMap.get("aroundRadius") == null){
            return 0;
        }
        return (float) this.configMap.get("aroundRadius");
    }

    /**
     * 获取行政区域名称
     * @return
     */
    public String getAreaName(){
        return (String) this.configMap.get("areaName");
    }

    /**
     * 参数是否完整，是否可以创建地理围栏。
     * @return
     */
    public boolean isValid(){
        switch (this.getFenceType()){
            case CIRCLE:
                return this.getDPoint() != null && this.getAroundRadius() != 0;
            case DISTRICT:
                return this.getAreaName() != null && !"".equals(this.getAreaName());
        }
        return false;
    }

    /**
     * 是否相同，验证两个地理围栏配置是否一致。
     * @param otherConfig
     * @return
     */
    public boolean isSame(GeoFenceConfig otherConfig){
        if(!getFenceType().equals(otherConfig.getFenceType())){
            return false;
        }
        if(getFenceType() == GeoFenceConfig.FenceType.DISTRICT){
            if(!getAreaName().equals(otherConfig.getAreaName())){
                return false;
            }
        }else{
            if(getAroundRadius() != otherConfig.getAroundRadius()){
                return false;
            }
            if(getDPoint().getLatitude() != otherConfig.getDPoint().getLatitude()){
                return false;
            }
            if(getDPoint().getLongitude() != otherConfig.getDPoint().getLongitude()){
                return false;
            }
        }
        return true;
    }

}
